type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';

interface LogOptions {
  level?: LogLevel;
  tag?: string; // 标识日志来源
  extra?: Record<string, any>; // 额外信息
}

class Logger {
  private isDev: boolean; // 根据环境判断是否打印到控制台

  constructor() {
    this.isDev = process.env.NODE_ENV === 'development'; // 或通过wx.getAccountInfoSync()判断
  }

  private formatLog(level: LogLevel, message: string, options?: LogOptions): string {
    const timestamp = new Date().toISOString();
    const tag = options?.tag ? `[${options.tag}]` : '';
    const extra = options?.extra ? JSON.stringify(options.extra) : '';
    return `${timestamp} [${level}]${tag} ${message} ${extra}`;
  }

  private sendToRemote(logData: Record<string, any>) {
    // 实际项目中，这里会发送HTTP请求到后端日志服务或第三方监控平台（如Sentry、阿里云SLS）
    // wx.request({
    //   url: 'YOUR_LOG_SERVER_ENDPOINT',
    //   method: 'POST',
    //   data: logData,
    //   success: () => {},
    //   fail: (err) => console.error('日志上报失败', err)
    // });
    console.log('（模拟）发送到远程日志服务：', logData);
  }

  log(level: LogLevel, message: string, options?: LogOptions) {
    const logMessage = this.formatLog(level, message, options);
    if (this.isDev) {
      switch (level) {
        case 'DEBUG':
          console.debug(logMessage);
          break;
        case 'INFO':
          console.info(logMessage);
          break;
        case 'WARN':
          console.warn(logMessage);
          break;
        case 'ERROR':
          console.error(logMessage);
          break;
        default:
          console.log(logMessage);
      }
    }
    // 生产环境可以只上报WARN和ERROR级别
    if (level === 'WARN' || level === 'ERROR') {
      this.sendToRemote({ level, message, ...options });
    }
  }

  debug(message: string, options?: Omit<LogOptions, 'level'>) {
    this.log('DEBUG', message, options);
  }

  info(message: string, options?: Omit<LogOptions, 'level'>) {
    this.log('INFO', message, options);
  }

  warn(message: string, options?: Omit<LogOptions, 'level'>) {
    this.log('WARN', message, options);
  }

  error(message: string, error?: Error, options?: Omit<LogOptions, 'level' | 'extra'>) {
    const errorMessage = error ? `${message}: ${error.message}\n${error.stack}` : message;
    this.log('ERROR', errorMessage, {
      ...options,
      extra: {
        ...options?.extra,
        errorName: error?.name,
        errorMessage: error?.message,
        errorStack: error?.stack,
      },
    });
  }
}

export const logger = new Logger();

// app.ts 中进行全局配置
// App({
//   onLaunch() {
//     // ...
//   },
//   onError(error: string) {
//     logger.error('应用发生未捕获错误', new Error(error), { tag: 'AppGlobalError' });
//   },
//   onPageNotFound(res: WechatMiniprogram.OnPageNotFoundCallbackResult) {
//     logger.warn(`页面未找到: ${res.path}`, { tag: 'AppPageNotFound', extra: res });
//     // 可以跳转到首页或通用错误页
//     // wx.reLaunch({ url: '/pages/index/index' });
//   },
//   // ...
// });

// 页面或组件中使用try-catch并上报
// Page({
//   onLoad() {
//     try {
//       // 某个可能出错的逻辑
//       throw new Error('这是一个页面内的模拟错误');
//     } catch (e: any) {
//       logger.error('页面加载失败', e, { tag: 'MyPage' });
//     }
//   }
// });
